package reference.example;

import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;

public class PhantomReferenceExample {
    public static void main(String[] args) {
        Object obj = new Object();
        ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();

        // 创建一个虚引用，关联到对象obj，并指定引用队列
        PhantomReference<Object> phantomReference = new PhantomReference<>(obj, referenceQueue);

        // 置空obj引用，使对象成为垃圾回收的候选
        obj = null;

        // 执行垃圾回收
        System.gc();

        try {
            // 等待一段时间，以确保垃圾回收线程完成工作
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 检查引用队列，看虚引用是否被添加到队列中
        Reference<?> reference = referenceQueue.poll();
        if (reference != null) {
            // 从引用队列中获取引用并进行相应处理
            System.out.println("PhantomReference is enqueued.");
        }
    }
}

